*/
static inline int uncached_access(struct file *file, unsigned long addr)
{
-#if defined(__i386__)
+#ifdef CONFIG_XEN
+ if (file->f_flags & O_SYNC)
+ return 1;
+ /* Xen sets correct MTRR type on non-RAM for us. */
+ return 0;
+#elif defined(__i386__)
/*
* On the PPro and successors, the MTRRs are used to set
* memory types for physical addresses outside main memory,
static int mmap_mem(struct file * file, struct vm_area_struct * vma)
{
-#if !defined(CONFIG_XEN)
unsigned long offset = vma->vm_pgoff << PAGE_SHIFT;
int uncached;
if (uncached)
vma->vm_flags |= VM_IO;
- if (remap_page_range(vma, vma->vm_start, offset, vma->vm_end-vma->vm_start,
- vma->vm_page_prot))
+#if defined(CONFIG_XEN)
+ if (io_remap_page_range(vma, vma->vm_start, offset,
+ vma->vm_end-vma->vm_start, vma->vm_page_prot))
return -EAGAIN;
- return 0;
-#elif !defined(CONFIG_XEN_PRIVILEGED_GUEST)
- return -ENXIO;
#else
- unsigned long offset = vma->vm_pgoff << PAGE_SHIFT;
-
- if (!(xen_start_info.flags & SIF_PRIVILEGED))
- return -ENXIO;
-
- /* Currently we're not smart about setting PTE cacheability. */
- vma->vm_flags |= VM_RESERVED | VM_IO;
- vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
-
- if (direct_remap_area_pages(vma->vm_mm, vma->vm_start, offset,
- vma->vm_end-vma->vm_start, vma->vm_page_prot,
- DOMID_IO))
+ if (remap_page_range(vma, vma->vm_start, offset, vma->vm_end-vma->vm_start,
+ vma->vm_page_prot))
return -EAGAIN;
- return 0;
#endif
+ return 0;
}
extern long vread(char *buf, char *addr, unsigned long count);
#define kern_addr_valid(addr) (1)
#endif /* !CONFIG_DISCONTIGMEM */
-#define io_remap_page_range remap_page_range
+#define io_remap_page_range(vma,from,phys,size,prot) \
+ direct_remap_area_pages(vma->vm_mm,from,phys,size,prot,DOMID_IO)
#define __HAVE_ARCH_PTEP_TEST_AND_CLEAR_YOUNG
#define __HAVE_ARCH_PTEP_TEST_AND_CLEAR_DIRTY